home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / varia / interp18.lha / interp-1.8 / Ast.h < prev    next >
C/C++ Source or Header  |  1990-01-22  |  6KB  |  263 lines

  1. // -*- C++ -*- Ast.h --- the class declaration for an abstract syntax tree.
  2. // Copyright (C) 1989 Carey Richard Murphey.
  3. // (rich@rice.edu) 5310 Rutherglenn, Houston, TX 77096
  4.  
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 1, or (at your option)
  8. // any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #ifndef _Ast_defs_h_
  20. #pragma once
  21. #define _Ast_defs_h_ 1
  22. #include <String.h>
  23. #include "Context.h"
  24.  
  25.  
  26. /* Nodes in the Abstract syntax tree have three in common.  For some
  27. `Node *p':
  28.  
  29.    1. p->eval() evaluates the node or subtree connected to it.
  30.  
  31.    2. p->echo(Stream) prints an equivalent source language representation
  32.       of the node or subtree on the specified stream.
  33.  
  34. */
  35.  
  36.  
  37. class Node            // a node in the Ast.
  38. {
  39. public:
  40.   Node () {}
  41.   virtual double eval () = 0;
  42.   virtual ostream& echo (ostream& Stream) = 0;
  43.   friend ostream& operator << (ostream& Stream, Node* p);
  44.   operator double ();
  45. };
  46.  
  47. class NoOp : public Node
  48. {
  49. public:
  50.   NoOp () : Node() {}
  51.   virtual double eval ();
  52.   virtual ostream& echo (ostream& Stream);
  53. };
  54.  
  55. class UnOp : public Node
  56. {
  57. protected:
  58.   Node *left;
  59. public:
  60.   UnOp (Node *l) : left(l), Node() {}
  61.   ~UnOp () {delete left;}
  62.   virtual double eval () = 0;
  63.   virtual ostream& echo (ostream& Stream) = 0;
  64. };
  65.  
  66. class BinOp : public Node
  67. {
  68. protected:
  69.   Node *left, *right;
  70. public:
  71.   BinOp (Node *l, Node *r) : left(l), right(r), Node() {}
  72.   ~BinOp () {delete left; delete right;}
  73.   virtual double eval () = 0;
  74.   virtual ostream& echo (ostream& Stream) = 0;
  75. };
  76.  
  77. class Sym : public Node
  78. {
  79. protected:
  80.   String name;
  81.   Table table;
  82. public:
  83.   Sym (String s, Table t) : name(s), table(t), Node() {}
  84.   virtual double eval ();
  85.   virtual ostream& echo (ostream& Stream);
  86.   virtual operator int ();
  87.   virtual operator double ();
  88.   virtual double func (double p);
  89.   virtual void assign (double p);
  90. };
  91.  
  92. class SymUnOp : public Node
  93. {
  94. protected:
  95.   Sym *left;
  96. public:
  97.   SymUnOp (Sym *l) : left(l), Node() {}
  98.   ~SymUnOp () {delete left;}
  99.   virtual double eval () = 0;
  100.   virtual ostream& echo (ostream& Stream) = 0;
  101. };
  102.  
  103. class SymBinOp : public Node
  104. {
  105. protected:
  106.   Sym *left;
  107.   Node *right;
  108. public:
  109.   SymBinOp (Sym *l, Node *r) : left(l), right(r), Node() {}
  110.   ~SymBinOp () {delete left; delete right;}
  111.   virtual double eval () = 0;
  112.   virtual ostream& echo (ostream& Stream) = 0;
  113. };
  114.  
  115. class Func : public SymBinOp
  116. {
  117. public:
  118.   Func (Sym *l, Node *r) : SymBinOp (l, r) {}
  119.   virtual double eval ();
  120.   virtual ostream& echo (ostream& Stream);
  121. };
  122.  
  123. class Assign : public SymBinOp
  124. {
  125. public:
  126.   Assign (Sym *l, Node *r) : SymBinOp (l, r) {}
  127.   virtual double eval ();
  128.   virtual ostream& echo (ostream& Stream);
  129. };
  130.  
  131. class PostIncrement : public SymUnOp
  132. {
  133. public:
  134.   PostIncrement (Sym *l) : SymUnOp (l) {}
  135.   virtual double eval ();
  136.   virtual ostream& echo (ostream& Stream);
  137. };
  138.  
  139. class PostDecrement : public SymUnOp
  140. {
  141. public:
  142.   PostDecrement (Sym *l) : SymUnOp (l) {}
  143.   virtual double eval ();
  144.   virtual ostream& echo (ostream& Stream);
  145. };
  146.  
  147. class PreIncrement : public SymUnOp
  148. {
  149. public:
  150.   PreIncrement (Sym *l) : SymUnOp (l) {}
  151.   virtual double eval ();
  152.   virtual ostream& echo (ostream& Stream);
  153. };
  154.  
  155. class PreDecrement : public SymUnOp
  156. {
  157. public:
  158.   PreDecrement (Sym *l) : SymUnOp (l) {}
  159.   virtual double eval ();
  160.   virtual ostream& echo (ostream& Stream);
  161. };
  162.  
  163. class If : public BinOp
  164. {
  165. public:
  166.   If (Node *l, Node *r) : BinOp (l, r) {}
  167.   virtual double eval ();
  168.   virtual ostream& echo (ostream& Stream);
  169. };
  170.  
  171. class While : public BinOp
  172. {
  173. public:
  174.   While (Node *l, Node *r) : BinOp (l, r) {}
  175.   virtual double eval ();
  176.   virtual ostream& echo (ostream& Stream);
  177. };
  178.  
  179. class Statements : public BinOp
  180. {
  181. public:
  182.   Statements (Node *l, Node *r) : BinOp (l, r) {}
  183.   virtual double eval ();
  184.   virtual ostream& echo (ostream& Stream);
  185. };
  186.  
  187. class Plus : public BinOp
  188. {
  189. public:
  190.   Plus (Node *l, Node *r) : BinOp (l, r) {}
  191.   virtual double eval ();
  192.   virtual ostream& echo (ostream& Stream);
  193. };
  194.  
  195. class Minus : public BinOp
  196. {
  197. public:
  198.   Minus (Node *l, Node *r) : BinOp (l, r) {}
  199.   virtual double eval ();
  200.   virtual ostream& echo (ostream& Stream);
  201. };
  202.  
  203. class Times : public BinOp
  204. {
  205. public:
  206.   Times (Node *l, Node *r) : BinOp (l, r) {}
  207.   virtual double eval ();
  208.   virtual ostream& echo (ostream& Stream);
  209. };
  210.  
  211. class Divide : public BinOp
  212. {
  213. public:
  214.   Divide (Node *l, Node *r) : BinOp (l, r) {}
  215.   virtual double eval ();
  216.   virtual ostream& echo (ostream& Stream);
  217. };
  218.  
  219. class Pow : public BinOp
  220. {
  221. public:
  222.   Pow (Node *l, Node *r) : BinOp (l, r) {}
  223.   virtual double eval ();
  224.   virtual ostream& echo (ostream& Stream);
  225. };
  226.  
  227. class Double : public Node
  228. {
  229. protected:
  230.   double value;
  231. public:
  232.   Double (double v) : value (v), Node() {}
  233.   virtual double eval ();
  234.   virtual ostream& echo (ostream& Stream);
  235. };
  236.  
  237. class Uminus : public UnOp
  238. {
  239. public:
  240.   Uminus (Node *l) : UnOp (l) {}
  241.   virtual double eval ();
  242.   virtual ostream& echo (ostream& Stream);
  243. };
  244.  
  245. class Double_Func : public SymBinOp
  246. {
  247.   Table symtab;            // the local symbol table holding the arguemnts.
  248. public:
  249.   Func (Sym *l, Node *r) : SymBinOp (l, r) {}
  250.   virtual double eval ();
  251.   virtual ostream& echo (ostream& Stream);
  252. };
  253.  
  254. #if defined(__OPTIMIZE__) && !defined(INLINE)
  255. #define INLINE inline
  256. #include "Ast.cc"
  257. #ifdef INLINE
  258. #undef INLINE
  259. #endif
  260. #endif
  261.  
  262. #endif
  263.